#ifndef _COMM_VALUE_H_
#define _COMM_VALUE_H_

#ifdef __cplusplus
extern "C" {
#endif

enum ValueType {
    VT_NIL,
    VT_NUMBER,
    VT_STRING,
    VT_TABLE,
};


typedef struct Value Value;

typedef struct ValuePair {
    Value * key;
    Value * val;
} ValuePair;
// alloc / free
Value * CreateValue();
void    DestoryValue(Value * val);

// cmp
int  ValueCmp(Value * v1, Value * v2);
enum ValueType ValueType(Value * val);

#define IsNil(val) (ValueType(val) == VT_NIL)
#define IsNumberValue(val) (ValueType(val) == VT_NUMBER)
#define IsStringValue(val) (ValueType(val) == VT_STRING)
#define IsTableValue(val) (ValueType(val) == VT_TABLE)

// init
Value * NilValue      ();
Value * NumberValue   (double val);
Value * StringValue   (const char * str, int len);
Value * ValueFromValue(Value * val);

// set
Value * ValueSetNil   (Value * val);
Value * ValueSetNumber(Value * val, double f);
Value * ValueSetString(Value * val, const char * str, size_t len);
Value * ValueSetSV    (Value * table, const char * key, Value * val);
Value * ValueSetIV    (Value * table, int key, Value * val);
Value * ValueSetKV    (Value * table, Value * key, Value * val);
Value * ValueSet      (Value * dv, Value * sv);

// get
double       ValueToNumber  (Value * val);
int          ValueToInterger(Value * val);
const char * ValueToString  (Value * val, size_t * len);

// get table
Value * TableValueByName (Value * table, const char * key);
Value * TableValueAtIndex(Value * table, int i);
Value * TableValueOf     (Value * table, Value * key);

// walk througt
//int     TableValueHashCount(Value * table);
int     TableValueArrayMaxIndex(Value * table);
ValuePair * TableValueHashNext(Value * table, ValuePair * cur);

#ifdef __cplusplus
}
#endif

#endif
